package org.club.common.util;

import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;

/**
 * 通用的API响应模型类，用于封装API请求的响应数据
 * <p>
 * 通过使用Lombok的@Data注解，自动生成getter和setter方法，简化编码
 * 使用@JsonInclude注解，仅序列化非空对象到JSON，优化数据传输
 * </p>
 * @author [L]
 * @version 1.0
 * @since [1.0.0]
 */
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ApiResponseMe {
    /**
     * 响应状态码
     * <p>
     * 用于标识响应的状态，例如200表示成功，400表示失败等
     * </p>
     * @example 200
     */
    private int code;

    /**
     * 响应消息
     * <p>
     * 对响应状态的描述性信息，用于向客户端提供更详细的说明
     * </p>
     * @example 操作成功
     */
    private String message;

    /**
     * 响应数据
     * <p>
     * 包含API操作的结果数据，可以是任意类型
     * </p>
     * @example {"id":1,"name":"示例数据"}
     */
    private Object data;

    // 默认构造函数，用于创建一个空的响应对象
    public ApiResponseMe() {
    }

    // 带参数的构造函数，用于创建一个带有状态码、消息和数据的响应对象
    public ApiResponseMe(int code, String message, Object data) {
        this.code = code;
        this.message = message;
        this.data = data;
    }

    /**
     * 创建一个表示成功操作的响应对象
     * <p>
     * 用于快速生成一个表示操作成功的响应，状态码固定为200，消息为"操作成功"
     * </p>
     * @param data 成功操作后的返回数据
     * @return 返回一个包含成功状态码和消息的ApiResponseMe对象
     * @example
     * ApiResponseMe successResponse = ApiResponseMe.success({"id":1,"name":"示例数据"});
     */
    public static ApiResponseMe success(Object data) {
        return new ApiResponseMe(200, "操作成功", data);
    }

    /**
     * 创建一个表示错误操作的响应对象
     * <p>
     * 用于生成一个表示操作失败的响应，状态码和消息由调用者指定
     * </p>
     * @param code 错误状态码
     * @param message 错误消息
     * @return 返回一个包含错误状态码和消息的ApiResponseMe对象
     * @example
     * ApiResponseMe errorResponse = ApiResponseMe.error(400,"参数错误");
     */
    public static ApiResponseMe error(int code, String message) {
        return new ApiResponseMe(code, message, null);
    }

    /**
     * 根据布尔值创建一个响应对象，布尔值为true表示成功，为false表示失败
     * <p>
     * 根据操作结果的布尔值快速生成相应的响应对象，成功状态码为200，失败状态码为400
     * </p>
     * @param boolen 操作结果的布尔值
     * @param message 操作消息
     * @return 根据布尔值返回相应的ApiResponseMe对象
     * @example
     * ApiResponseMe response = ApiResponseMe.shape(true,"操作成功");
     */
    public static ApiResponseMe shape(Boolean boolen, String message) {
        return new ApiResponseMe(boolen ? 200 : 400, message, null);
    }
}